#include <iostream>
#include <vector>

using namespace std;


//代理类
template<typename _Tp>
class auto_ptr
{
private:
    //外部的数据
    _Tp* _M_ptr;
public:
    explicit auto_ptr(_Tp* __p = 0) throw() : _M_ptr(__p) {}
//    ~auto_ptr() {
//        count--;
//       if(count < 1){
//           delete _M_ptr;
//       }
//    }

    ~auto_ptr() {
        //能不能判断一下这个数据是否一个回收？
        delete _M_ptr;
    }

    _Tp* operator *()
    {
        return _M_ptr;
    }

    auto_ptr<_Tp>* operator =(auto_ptr<_Tp> &tp)
    {
        _M_ptr = tp._M_ptr;
        return this;
    }
    auto_ptr<_Tp> operator =( _Tp &tp)
    {
        _M_ptr = tp;
        return this;
    }
};

class Test{
public:
    Test(){
        cout<< "Test...."<<endl;
    }
    Test(Test &t){
        cout<< " Test(Test &t)...."<<endl;
    }
    ~Test(){
        cout<< "~Test...."<<this<<endl;
    }
};



int main()
{
//    int* p = new int(10);
//    auto_ptr<int> auto_p(p);

    auto_ptr<int> auto_p(new int(10));

    auto_ptr<Test> auto_p1( new Test() );
    auto_ptr<Test> auto_p2( new Test() );
    auto_p1 = auto_p2;

    //因为auto_ptr的所有权独有，所以防止两个auto_ptr对象指向同一块内存。
    //这样会导致程序潜在的内存崩溃，这也是摒弃auto_ptr的原因。
//    auto_ptr<Test> datas[3] =
//            {
//                    auto_ptr<Test>(new Test()),
//                    auto_ptr<Test>(new Test()),
//                    auto_ptr<Test>(new Test())
//            };
//    auto_ptr<Test> p;
//    p=datas[1]; //datas[1]将所有权转给p,此时datas[1]不再指向"data2"字符串而变成空指针。
//    for(int i=0; i<3; i++)
//    {
//        cout<< *datas[i]<<endl; //i=1时，程序崩溃，使用shared_ptr、unique_ptr可以避免程序本刊问题
//    }
//    cout<<"------------*****************-------------"<<endl;
//    cout<<*p<<endl;


}

